home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / MiniExamples / AppKit / AtYourService / MyDelegate.m < prev    next >
Text File  |  1995-06-12  |  6KB  |  208 lines

  1.  
  2. /* This Object is the application's delegate. It is responsible for setting 
  3.  * itself up as the Delegate for Services requests specific to this 
  4.  * application. It interfaces with another object which handles services 
  5.  * preferences
  6.  */
  7. #import <appkit/appkit.h>
  8. #import <defaults/defaults.h>
  9. #import <strings.h>
  10. #import <mach/mach.h>
  11.  
  12. #import "DefaultHandler.h"
  13. #import "MyDelegate.h"
  14.  
  15.  
  16. @implementation MyDelegate
  17.  
  18. /* Setup Services Delegate and Initialize defaults */
  19.  
  20. - appDidInit:sender
  21. {
  22.     [[NXApp appListener] setServicesDelegate:self];  
  23.     [defaultHandler readDefaults:self];
  24.     return self;
  25. }
  26.  
  27. /* Brings up the Info panel.   Not done on startup because it's in a separate
  28.  * interface file. Saves startup time for the user if we do this when they ask
  29.  * for it, and not before.
  30.  */
  31. - infoPanel:sender
  32. {
  33.     if( ! infoPanel ){
  34.         [NXApp loadNibSection:"Information.nib" owner:self];
  35.     }
  36.     [infoPanel makeKeyAndOrderFront:sender];
  37.     return self;    
  38. }
  39.  
  40. /*
  41.  * Brings up the Help panel (as above)
  42.  */
  43. - helpPanel:sender
  44. {
  45.     if( ! helpPanel ){
  46.         [NXApp loadNibSection:"Information.nib" owner:self];
  47.     }
  48.     [helpPanel makeKeyAndOrderFront:sender];
  49.     return self;    
  50.  
  51. }
  52.  
  53. /*  This method sends the data from the sender's "preferred" pasteboard
  54.  *  (the first on the "types" list) through the Unix sort utility and 
  55.  *  back to both the Ascii and TabText pasteboards.
  56.  */
  57.  
  58. - sort:(id)pasteboard
  59.     userData:(const char *)sortArgs
  60.     error:(char **)errorMessage
  61. {
  62.     int length, lengths[2], storedOutput[2], thisPboard, currentType;
  63.     const char *data;
  64.     const char *const *ptypes;
  65.     char *myTypes[2];
  66.     char *outputPboards[2];
  67.     
  68.     myTypes[0] = (char *) NXAsciiPboardType;             storedOutput[0] = 0;
  69.     myTypes[1] = (char *) NXTabularTextPboardType;       storedOutput[1] = 0;
  70.     
  71.     ptypes=[pasteboard types];
  72.     
  73.    /* calculate over all pasteboardtypes passed in */
  74.     for (currentType=0; ptypes[currentType] ; currentType++ )
  75.         if (    ( !strcmp(ptypes[currentType],NXTabularTextPboardType) ) ||
  76.                 ( !strcmp(ptypes[currentType],NXAsciiPboardType) )) {
  77.         FILE *temp, *process;
  78.         int i;
  79.         char filename[25], command[256];
  80.         char *outbuffer;
  81.         
  82.         [pasteboard readType:ptypes[currentType] data:&data length:&length];
  83.         thisPboard= ( strcmp(ptypes[currentType],myTypes[0]) );
  84.         
  85.         outputPboards[thisPboard]=malloc(length+2);
  86.         outbuffer=outputPboards[thisPboard];
  87.         
  88.         strncpy(outbuffer, data, length);
  89.         if ( outbuffer[length-1] != '\n' ) {
  90.         
  91.           /* Sort data needs a newline at the end,  add one */
  92.             outbuffer[length] = '\n';
  93.             outbuffer[length+1] = '\0';
  94.         }
  95.         else outbuffer[length]='\0';
  96.  
  97.       /* Make a temporary file to give to Sort */
  98.         
  99.         strcpy(filename,"/tmp/file000000Selection" );
  100.         NXGetTempFilename(filename,9);
  101.         temp=fopen(filename,"w");
  102.         fprintf(temp,outbuffer);
  103.         fclose(temp);
  104.         
  105.       /* Call Sort using popen(),  The userData supplied has the
  106.        * arguments for Sort (see "services" file).
  107.        */
  108.         sprintf(command,"sort %s %s %s\n",
  109.                 [defaultHandler sortFields],sortArgs,filename);
  110.         process=popen(command,"r");
  111.         
  112.         for (i=0; ((outbuffer[i]=getc(process)) != EOF); i++)
  113.             outbuffer[i+1] = '\0';
  114.             
  115.         lengths[thisPboard] = i;
  116.         storedOutput[thisPboard] = 1;   
  117.         
  118.         unlink(filename);
  119.         pclose(process);
  120.     }
  121.     
  122.     if (!storedOutput[0] && !storedOutput[1]) 
  123.         *errorMessage = "No ASCII text found in your selection.";
  124.     else  {
  125.         [pasteboard declareTypes:&myTypes[0] num:2 owner:self];
  126.         
  127.       /* Place the results on the corresponding pasteboards. The two pboards
  128.        * are somewhat interchangeable,  if one result doesn't exist,  send the
  129.        * other result in its place.  A service must provide all pboard types 
  130.        * mentioned as "Return Types" in the services section. 
  131.        */
  132.         
  133.         [pasteboard writeType:myTypes[0] 
  134.             data: storedOutput[0] ? outputPboards[0] : outputPboards[1]
  135.             length:storedOutput[0] ? lengths[0] : lengths[1]];
  136.         [pasteboard writeType:myTypes[1] 
  137.             data: storedOutput[1] ? outputPboards[1] : outputPboards[0]
  138.             length:storedOutput[1] ? lengths[1] : lengths[0]];
  139.         if (storedOutput[0]) free(outputPboards[0]);
  140.         if (storedOutput[1]) free(outputPboards[1]);
  141.         }
  142.  
  143.     return self;
  144. }
  145.  
  146. /* Another simple service that capitalizes words */
  147.  
  148. - capitalize:pb userData:(const char *)userData error:(char **)errorMessage
  149. {
  150.     char *data;
  151.     int length;
  152.     const char *const *types;
  153.     int hasAscii, i;
  154.  
  155.     types = [pb types];
  156.     hasAscii=0;
  157.     for (i=0; !hasAscii && types[i] ; i++) 
  158.         if (!strcmp(types[i], NXAsciiPboardType)) hasAscii=1;
  159.     if (hasAscii) {
  160.         [pb readType:NXAsciiPboardType data:&data length:&length];
  161.         if (data && length) {
  162.             int First, i;
  163.             char *returnData;
  164.             
  165.             returnData=malloc(length+1);
  166.             First=TRUE;
  167.             data = strncpy(returnData, data, length);
  168.             returnData[length] = '\0';
  169.             for (i=1;i<=length;i++) {
  170.                 if ( NXIsLower(*data) && First ) {
  171.                         *data = NXToUpper(*data);
  172.                         First=FALSE;
  173.                 }
  174.                 else if (! NXIsAlpha(*data)) First=TRUE;
  175.                     else First=FALSE;
  176.                 data++;
  177.             }
  178.             [pb declareTypes:&NXAsciiPboardType num:1 owner:self];
  179.             [pb writeType:NXAsciiPboardType data:returnData length:length];
  180.             free(returnData);
  181.         } 
  182.         else *errorMessage = "No data in your selection.";
  183.     } 
  184.     else *errorMessage = "No ASCII text found in your selection.";
  185.  
  186.     return self;
  187. }
  188.  
  189. /*  This is an example of a Service that take no input.  It simply returns
  190.  *  the current date and time.
  191.  */
  192.  
  193. - timestamp:(id)pasteboard
  194.     userData:(const char *)sortArgs
  195.     error:(char **)msg
  196. {
  197.     long timenum;
  198.     char *data;
  199.  
  200.     timenum=time(NULL);
  201.     data=asctime(localtime(&timenum));
  202.     [pasteboard declareTypes:&NXAsciiPboardType num:1 owner:self];
  203.     [pasteboard writeType:NXAsciiPboardType data:data length:25];
  204.     return self;
  205. }
  206.  
  207. @end
  208.